# coding: utf-8
# @Author: ChuiZi
import xlrd
import json
from json import JSONDecodeError


# <editor-fold desc="读取不同数据类型的方法">
def load_xls(dataPath):
    """
    读取单个xls文件数据,包括该xls文件内所有工作簿,返回所有用例参数组成的列表

    :param dataPath: xls格式的数据所在的绝对路径
    :return: [{ceil(1,A),ceil(1,B)……},{ceil(2,A),ceil(2,B)……}……]……]
    """
    datas = []
    xls_data = {}
    xls_file = xlrd.open_workbook_xls(dataPath)
    for sheet_name in xls_file.sheet_names():
        sheet_local = xls_file.sheet_by_name(sheet_name)
        sheet_row = sheet_local.nrows
        sheet_head = []
        if sheet_row:  # 判断当前工作簿是否存在数据
            sheet_data = []
            for head_index in range(sheet_local.ncols):
                sheet_head.append(sheet_local.cell_value(0, head_index))  # 获取表头名称
            for row in range(sheet_row)[1:]:  # 去除表头
                data_row = {}
                for col in range(sheet_local.ncols):
                    """开始对数据进行处理"""
                    try:
                        value = sheet_local.cell_value(row, col).replace("\'", '"')
                    except AttributeError:
                        value = sheet_local.cell_value(row, col)
                    """对数据进行处理完成"""
                    data_row.update({sheet_head[col]: value})  # 获取工作簿每一个行数据
                sheet_data.append(data_row)  # 获取每一个工作簿数据
            xls_data.update({sheet_name: sheet_data})  # 获取当前xls文件数据

    for page in xls_data.keys():
        datas.extend(xls_data[page])
    return datas


def load_csv(dataPath):
    pass

def load_yaml(dataPath):
    pass


# </editor-fold>
# <editor-fold desc="格式化数据的方法,非通用">
def formatDict(data: list):
    """
    将输入的列表或者字典格式的数据内部可以转换为字典格式则转换为字典格式
    :param data: 列表或者字典格式的数据
    :return: 与入参数据相同但是格式已经转换为dict的列表或者字典
    """
    if isinstance(data, list) or isinstance(data, dict):
        assert TypeError("读取测试用例数据,formatDict方法转换源数据格式错误")
    for key in data:
        try:
            data[key] = json.loads(data.get(key))  # 转换数据格式为dict
        except (TypeError, JSONDecodeError):
            # 屏蔽不符合转换要求的报错
            pass
    return data


# </editor-fold>
# <editor-fold desc="对数据处理的一般方法">

def merge_dict(dictA, dictB):
    """合并两个存在深度且key相同的字典,返回根据key进行合并的字典.类似于树状图收敛

    :param dictA: 需要合并的字典A
    :param dictB: 需要合并的字典B
    :return: 根据key进行合并的字典
    """
    if isinstance(dictA, dict) and isinstance(dictB, dict):
        res_data = {}
        dataB_keys = list(dictB.keys())
        for keyA in dictA.keys():
            # 判断keyA是否存在于dataB的当前层级中
            if keyA in dataB_keys:
                # 若dataA和dataB存在相同的key,则进入下一步
                dataB_keys.remove(keyA)
                res_data[keyA] = merge_dict(dictA[keyA], dictB[keyA])
            else:
                # 若dataA和dataB不存在相同的key,则降dataA添加进缓存,返回给dataB
                res_data[keyA] = dictA[keyA]
        for keyB in dataB_keys:
            # 若dataB中还存在dataA中不存在的键值对,则将该值添加给新字典
            res_data[keyB] = dictB[keyB]
        return res_data  # 返回新字典
    else:
        return dictB


# </editor-fold>


if __name__ == '__main__':
    import os

    from lib.baseParams import rootPath
    from lib.common.baseFunc import callSelf

    # <editor-fold desc="测试用例数据的模板(要调用哪个就只不注释哪个,默认测试xls格式)">
    pathData = os.path.join(rootPath, r"options\temp\测试用例模板数据Xls格式.xls")  # xls格式
    # pathData =os.path.join(rootPath, r"options\temp\测试用例模板数据Csv格式.csv")  # csv格式
    # pathData = os.path.join(rootPath, r"options\temp\测试用例模板数据Yaml格式.yaml") # yaml格式
    # </editor-fold>
    dataType = {"xls": load_xls, "csv": load_csv, "yaml": load_yaml}
    tail = os.path.splitext(pathData)[1].replace(".", "")
    print(callSelf(dataType[tail], pathData))
